How are HTTP Requests handled by middleware in ASP.NET Core?
रिक्वेस्ट को मिडिलवेयर के द्वारा कैसे हैंडल किया जाता है?
जब कोई रिक्वेस्ट क्लाइंट के द्वारा सर्वर के पास भेजा जाता है, तो सर्वर उस रिक्वेस्ट को हैंडल करने के लिए वेब एप्लीकेशन के मिडिलवेयर पाइपलाइन (Middleware Pipeline) का उपयोग करता है।
मिडिलवेयर का अर्थ HTTP रिक्वेस्ट को हैंडल करने से है जो एक खास प्रकार की कार्यक्षमता को पूरा करता है। कहने का अभिप्राय यह है कि प्रत्येक मिडिलवेयर एक खास प्रकार की कार्यक्षमता को पूरा करता है और वह HTTP रिक्वेस्ट से बने HttpContext ऑब्जेक्ट को देखकर करता है।
जब कोई भी HTTP रिक्वेस्ट क्लाइंट के द्वारा सर्वर में भेजा जाता है, तो वेब सर्वर HttpContext नामक ऑब्जेक्ट बनाता है जिसके भीतर रिक्वेस्ट से संबंधित सभी प्रकार की जानकारियां एकत्रित होती हैं। इन्हीं जानकारी के आधार पर कोई भी मिडिलवेयर प्रोसेसिंग करता है।
मिडिलवेयर दो प्रकार का होता है: एक बना-बनाया मिडिलवेयर जो फ्रेमवर्क के द्वारा उपलब्ध होता है, दूसरा कस्टम मिडिलवेयर जो कोई भी डेवलपर खुद बनाता है।
किसी भी बने-बनाए मिडिलवेयर को उपयोग करने के लिए, उससे संबंधित पैकेज को NuGet मैनेजर की सहायता से इंस्टॉल करना पड़ता है। उदाहरण के लिए,
- अगर एप्लीकेशन के एक्सेप्शन को दिखाना हो, तो उसके लिए हम DeveloperExceptionPageMiddleware नामक मिडिलवेयर का उपयोग करते हैं अथवा ExceptionHandlerMiddleware का उपयोग करते हैं।
- इसी प्रकार, जब एप्लीकेशन स्टार्ट होता है, तो उस समय एक वेलकम पेज दिखाने के लिए WelcomePageMiddleware का उपयोग कर सकते हैं। सच तो यह है कि मिडिलवेयर हजारों तरह के होते हैं और वे अलग-अलग तरह की कार्यक्षमताओं को ध्यान में रखते हुए बनाए जाते हैं।
क्रॉस-कटिंग कंसर्न (Cross-Cutting Concern)
एक बात ध्यान देने वाली है कि मिडिलवेयर का प्रयोग एप्लीकेशन के क्रॉस-कटिंग कंसर्न (Cross-Cutting Concern) को ध्यान में रखते हुए किया जाता है। क्रॉस-कटिंग कंसर्न से अभिप्राय है कि ऐसी आवश्यकताएं जो एप्लीकेशन के अलग-अलग बिंदुओं, चरणों या स्टेप्स में जरूरत पड़ती हैं, जैसे कि एप्लीकेशन की ऑडिटिंग, सिक्योरिटी, लॉगिंग इत्यादि। आप किसी कंट्रोलर के एक्शन मेथड के भीतर लॉगिंग कर सकते हैं अथवा जब एप्लीकेशन रिक्वेस्ट को रिसीव करता है, तो उसके विभिन्न चरणों में भी आप लॉगिंग कर सकते हैं। तो अतः स्पष्ट है कि लॉगिंग की प्रक्रिया एक क्रॉस-कटिंग कंसर्न है क्योंकि इसका संबंध किसी एक हिस्से से नहीं है, जबकि एप्लीकेशन के विभिन्न स्थानों में इसका उपयोग होता है। इस तरह के क्रॉस-कटिंग कंसर्न से संबंधित कार्यक्षमता के लिए मिडिलवेयर का उपयोग करते हैं।
मिडिलवेयर पाइपलाइन से अभिप्राय
.NET Core के भीतर Startup.cs फाइल के भीतर Configure मेथड के भीतर मिडिलवेयर पाइपलाइन का उपयोग करते हैं। मिडिलवेयर पाइपलाइन से अभिप्राय कई सारे मिडिलवेयर को एक क्रमबद्ध तरीके से व्यवस्थित करके रखने से है। इसमें एक मिडिलवेयर दूसरे मिडिलवेयर को अपना डेटा पास करता है और दूसरे मिडिलवेयर द्वारा उसका प्रोसेसिंग होता है। यह प्रक्रिया चलती रहती है जब तक कि अंतिम मिडिलवेयर न आ जाए। अंतिम मिडिलवेयर को टर्मिनेटिंग मिडिलवेयर (Terminating Middleware) कहते हैं। कई बार ऐसा होता है कि किसी मिडिलवेयर पाइपलाइन के भीतर कोई मिडिलवेयर अगले मिडिलवेयर को डेटा प्रोसेसिंग के लिए नहीं भेजता है। इस स्थिति को मिडिलवेयर शॉर्ट-सर्किटिग (Middleware Short-Circuiting) कहते हैं। शॉर्ट-सर्किटिग का अभिप्राय है कि अगले मिडिलवेयर को डेटा प्रोसेसिंग के लिए नहीं भेजा जाता है।
मिडिलवेयर पाइपलाइन की एक बात समझने वाली यह है कि मिडिलवेयर पाइपलाइन न केवल HTTP रिक्वेस्ट को हैंडल करता है और उसे प्रोसेस करता है, बल्कि वह HTTP रिस्पॉन्स को भी प्रोसेस करता है। कहने का अभिप्राय यह है कि मिडिलवेयर पाइपलाइन बायडायरेक्शनल (Bi-directional) तरीके से वर्क करता है - HTTP रिक्वेस्ट को भी हैंडल करता है और HTTP रिस्पॉन्स को भी हैंडल करता है।
जैसा कि हमने पहले ही बताया कि .NET Core एप्लीकेशन के भीतर सर्विस का उपयोग बहुत आयत में होता है और कुछ फ्रेमवर्क सर्विसेज होती हैं जिनका उपयोग एप्लीकेशन के भीतर जगह-जगह उपयोग किया जाता है। उदाहरण के लिए, Configure मेथड के भीतर भी आप IApplicationBuilder, IWebHostEnvironment और दूसरे सर्विसेज का उपयोग करते हैं। उनके उपयोग करने से हम कई तरह के लाभ उठाते हैं। उदाहरण के लिए, IWebHostEnvironment ऑब्जेक्ट की मदद से हम वेब रूट पाथ, कंटेंट रूट पाथ, एनवायरनमेंट नेम इत्यादि को प्राप्त कर सकते हैं। इसी तरह, IApplicationBuilder की सहायता से आप किसी भी मिडिलवेयर को कॉल कर सकते हैं।
प्रमुख मिडिलवेयर
अब हम कुछ प्रमुख मिडिलवेयर के बारे में समझेंगे:
स्टैटिक फाइल्स मिडिलवेयर (Static Files Middleware):
इसका उपयोग कर हम अपने वेब एप्लीकेशन के स्टैटिक फाइल्स को यूजर को प्रदान कर सकते हैं। एप्लीकेशन की किसी भी दूसरे फोल्डर से (सिवाय wwwroot के) स्टैटिक फाइल को रखने पर उसे प्राप्त नहीं किया जा सकता है। जब स्टैटिक फाइल्स जैसे CSS फाइलें, जावास्क्रिप्ट फाइलें या इमेज फाइलें को wwwroot फोल्डर के भीतर रख दिया जाता है और उसको URL की मदद से एक्सेस करने की कोशिश की जाती है, तो उसके लिए हमें मिडिलवेयर की जरूरत पड़ती है जो इन स्टैटिक फाइल को प्राप्त कर यूजर को प्रदान कर दें। इसके लिए स्टैटिक फाइल्स मिडिलवेयर का उपयोग किया जाता है। बिना इस मिडिलवेयर को अपने पाइपलाइन में बिछाए, हमें स्टैटिक फाइल्स को प्राप्त नहीं कर सकते हैं।
डेवलपर एक्सेप्शन पेज मिडिलवेयर (Developer Exception Page Middleware):
इस मिडिलवेयर का उपयोग किसी भी डेवलपमेंट एनवायरनमेंट में किया जाता है। इसकी सहायता से कोई भी डेवलपर एप्लीकेशन को डेवलप करने के दौरान उत्पन्न होने वाले विभिन्न प्रकार की त्रुटियों को देख और समझ सकता है। त्रुटियों को देखने और समझने की जरूरत डेवलपमेंट के समय ही होती है, प्रोडक्शन एनवायरनमेंट में इसका उपयोग नहीं करना चाहिए।
वेलकम पेज मिडिलवेयर (Welcome Page Middleware):
इस मिडिलवेयर का उपयोग करके हम एप्लीकेशन के स्टार्ट होने पर एक वेलकम पेज यूजर को दिखा सकते हैं।
MVC मिडिलवेयर:
अभी तक हमने जिन मिडिलवेयर की चर्चा की, उनका उपयोग किसी HttpContext ऑब्जेक्ट को प्रोसेस करने के लिए किया जाता है। अब हम एक अत्यंत महत्वपूर्ण मिडिलवेयर की बात करेंगे जिसको MVC मिडिलवेयर (MVC Middleware) कहते हैं। MVC मिडिलवेयर की सहायता से HTTP रिस्पॉन्स में एक HTML पेज को रिटर्न किया जाता है।
जैसा कि मिडिलवेयर कंट्रोलर और व्यू से संबंधित है, जब कोई यूजर URL में कंट्रोलर और एक्शन मेथड को लिखकर एंटर प्रेस करता है, तो रिक्वेस्ट HTTP पाइपलाइन से गुजरते हुए अंत में MVC मिडिलवेयर के पास पहुंचता है। MVC मिडिलवेयर कंट्रोलर और एक्शन मेथड को देखते हुए संबंधित कंट्रोलर और उससे संबंधित एक्शन मेथड के पास उस रिक्वेस्ट को प्रोसेस करने के लिए भेज देता है।
एक बात ध्यान देने वाली है कि MVC मिडिलवेयर के पहले हमें अपने एप्लीकेशन में MVC सर्विस को रजिस्टर करना पड़ता है। इसके लिए हमने पहले भी चर्चा की है कि ConfigureServices मेथड के भीतर कैसे हम अपने किसी फ्रेमवर्क सर्विस को रजिस्टर करते हैं। MVC सर्विस के लिए हमारे पास बना-बनाया पैकेज आता है जिसे NuGet मैनेजर की सहायता से इंस्टॉल किया जा सकता है। इसको इंस्टॉल करने के बाद हम उसे ConfigureServices मेथड के भीतर रजिस्टर कर लेते हैं, तब जाकर हम मिडिलवेयर के भीतर MVC मिडिलवेयर का उपयोग कर पाते हैं। अगर आप ऐसा नहीं करेंगे तो आपको एक्सेप्शन आएगा।
रूटीन मिडिलवेयर
एक बात और समझने वाली है कि किसी कंट्रोलर और उससे संबंधित एक्शन मेथड तक पहुंचाने के लिए हमें रूटीन (Routing) की भी जरूरत पड़ती है। तो यह भी जरूरी है कि हम रूटीन से संबंधित मिडिलवेयर को भी अपने पाइपलाइन में जोड़ लें.
जैसा कि हमने देखा कि मिडिलवेयर पाइपलाइन के भीतर मिडिलवेयर को एक निश्चित क्रम में व्यवस्थित किया जाता है। वे अपना डेटा शेयर करते हैं। अगर ऐसा नहीं किया जाए (यानी, जब क्रम को विपरीत कर दिया जाए), तो अगले मिडिलवेयर को पिछले मिडिलवेयर से वह डेटा नहीं प्राप्त होगा। अतः, मिडिलवेयर पाइपलाइन के भीतर मिडिलवेयर का एक व्यवस्थित क्रम आवश्यक है.
ऑथेंटिकेशन और ऑथराइजेशन मिडिलवेयर
अब इस बात को हम एक उदाहरण से समझते हैं: मान लीजिए कि आप अपनी एप्लीकेशन के भीतर क्रॉस-कटिंग कंसर्न को ध्यान में रखते हुए सिक्योरिटी को अप्लाई करना चाहते हैं। इसके लिए आप अपने एप्लीकेशन में ऑथेंटिकेशन मिडिलवेयर (Authentication Middleware) और ऑथराइजेशन मिडिलवेयर (Authorization Middleware) का उपयोग कर सकते हैं। तो यह जरूरी है कि हम पहले ऑथेंटिकेशन मिडिलवेयर को रखें और उसके बाद ऑथराइजेशन मिडिलवेयर को रखें। क्योंकि जब यूजर का ऑथेंटिकेशन हो जाएगा, तो उससे संबंधित डेटा/इन्फॉर्मेशन ऑथराइजेशन मिडिलवेयर को भेज दिया जाएगा। उस इन्फॉर्मेशन के आधार पर ऑथराइजेशन मिडिलवेयर यूजर को किसी कंट्रोलर या किसी एक्शन मेथड को एक्सेस करने के लिए अलाऊ करेगा अथवा मना कर देगा.
टिप्पणियाँ
एक टिप्पणी भेजें